package com.sun.test;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Scanner;

public class ArrayDay {
    public static void main(String[] args) {
       /* 2.题目：输入某年某月某日，判断这一天是这一年的第几天？
        分析：以3月5日为例，先把前两个月的加起来，然后再加上5天即本年第几天，
        特殊情况，闰年且输入月份大于3需考虑多加一天。可定义数组存储1-12月各月天数。
        */
//        GetTheNumberOfDays();
        //getYearAndMonthAndDay();

        //3.使用二分法查找有序数组中元素。找到返回索引，不存在输出-1。使用递归实现
        int [] array={3,4,5,7,9,22,44,77,88,99,166};
        System.out.println(searchElement(array, 0, array.length - 1, 22));
    }

    /**`
     * 输入年，月，日得到这天是这一年的第几天
     */
    public static  void getDay(){
        BufferedReader bf=new BufferedReader(new InputStreamReader(System.in));
        try {
            //录入键盘的数据
            String str=bf.readLine();
            //分割年月日
            String[] strArr=str.split("-");
            int year=Integer.parseInt(strArr[0]);
            int month=Integer.parseInt(strArr[1]);
            int towMonth=28;
            //判断平年还是闰年
            if((year%4==0&&year%100!=0)||(year%400==0)){
                towMonth=29;//闰年多一天
            }
            int totalDay=0;
            int[] months={31,towMonth,31,30,31,30,31,31,30,31,30,31};
            //前几个月加上本月的天数
            for(int i=0;i<months.length;i++){
                if(month>=i+1){
                    if(month==i+1){
                        totalDay+=Integer.parseInt(strArr[2]);
                        break;
                    }else{
                        totalDay+=months[i];
                    }
                }
            }
            //输出结果
            System.out.println(totalDay);
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    /**
     * 输入年月日查询当前是第一天
     */
    public static  void  GetTheNumberOfDays(){
        //声明变量存放年，月，日
        //闰年
        int[] leapYear={0,31,60,91,121,152,182,213,244,274,305,335,366};
        //平年
        int[] commonYear={0,31,59,90,120,151,181,212,243,273,304,334,365};
        //创建Scanner对象
        Scanner sc=new Scanner(System.in);
        //提示用户录入年份
        System.out.println("请输入您要查询的年份：");
        //接收用户录入的年份
        int year=sc.nextInt();
        //提示用户录入月份
        System.out.println("请输入您要查询的月份：");
        //接收用户录入的月份
        int month = sc.nextInt();
        //提示用户录入天数
        System.out.println("请录入您要查询的天数：");
        //接收用户录入的天数
        int toDay=sc.nextInt();
        //从某年到某月某天的总天数
        int sumDay=0;
        //月份输入有误的情况
        if (month>12||month<1) {
            System.out.println("请输入正确的月份");
        }else {
            //输入月份正确
            //判断是否为闰年
            if((year%4==0&&year%100!=0)||(year%400==0)){
                //为闰年的情况
                //获取天数为31天的月份
                if (month==1||month==3||month==5||month==7||month==8||month==10||month==12) {
                    //判断天数是否在31天内
                    if (toDay<1||toDay>31) {
                        System.out.println("请输入正确的天数");
                    }else{
                        //在31天内
                        sumDay=leapYear[month-1]+toDay;//获取总天数
                    }
                }else if(month==2){
                    //判断天数是否在29天内
                    if(toDay<1||toDay>29){
                        System.out.println("请输入正确的天数");

                    }else {
                        sumDay=leapYear[month-1]+toDay;
                    }
                }else{
                    //4,6,7,9,11中的一月
                    //判断天数是否在30天内
                    if(toDay<1||toDay>30){
                        System.out.println("请输入正确的天数");
                    }else{
                        sumDay=leapYear[month-1]+toDay;
                    }
                }
            }else{
                //平年
                //天数为31天的月份
                if (month==1||month==3||month==5||month==7||month==8||month==10||month==12) {
                    //判断天数是否在31天内
                    if (toDay<1||toDay>31) {
                        System.out.println("请输入正确的天数");
                    }else{
                        //在31天内
                        sumDay=leapYear[month-1]+toDay;//获取总天数
                    }
                }else if(month==2){
                    //判断是否在28天内
                    if(toDay<1||toDay>28){
                        System.out.println("请输入正确的天数");
                    }else{
                        sumDay=commonYear[month-1]+toDay;
                    }
                }else{
                    //4,6,7,9,11中的一月
                    //判断天数是否在30天内
                    if(toDay<1||toDay>30){
                        System.out.println("请输入正确的天数");
                    }else{
                        sumDay=commonYear[month-1]+toDay;
                    }
                }
            }
        }
        System.out.println("这一天为"+year+"年"+month+"月的第"+sumDay+"天");
    }
    /**
     * 输入年月日查询当前是第一天
     */
    public static void getYearAndMonthAndDay(){
        //1.创建Scanner对象
        Scanner sc=new Scanner(System.in);
        //提示用户输入要查询的年，月，日
        System.out.println("请输入要查询的年份：");
        int year=sc.nextInt();
        System.out.println("请输入要查询的月份：");
        int month=sc.nextInt();
        System.out.println("请输入要查询的天数：");
        int day=sc.nextInt();
        //总天数
        int sumDay=0;
        //平年一年365天，平年里每个月的天数
        int []month1=new int[]{31,28,31,30,31,30,31,31,30,31,30,31};
        //闰年一年366天
        if(year%4==0&&year%100!=0||year%400==0){
            //闰年里的每个月的天数
            month1=new int[]{31,29,31,30,31,30,31,31,30,31,30,31};
        }
        //判断这一天是这一年里的第几天
        for (int index = 1; index <=month; index++) {
            if(index==1){
                sumDay= day;
            }else{
                sumDay+=month1[index-2];
            }
        }
        System.out.println("这一天是"+year+"年"+month+"月里的第"+sumDay+"天！");

    }

    /**
     * 执行递归二分查找，返回第一次出现该值的位置
     * @param arr 已排序的数组
     * @param start 开始位置
     * @param end 结束位置
     * @param findElement 需要查找的元素
     * @return 元素在数组中的位置，从0开始，找不到返回-1
     */
    public static int searchElement(int[] arr,int start,int end,int findElement){

        //判断数组中是否有元素
        if(arr==null||arr.length == 0){
            return -1;
        }
        //查找值
        if(start<end){
            //找到中间值的索引
            int middle=(start+end)/2;
            //中间元素
            int middleValue=arr[middle];
            //判断查找的元素是否为中间值
            if(findElement==middleValue){
                //等于中间值,直接返回
                return middle;
            }else if(findElement<middleValue){
                //小于中间值，在中间值左边进行查找
                return searchElement(arr,start,middle-1,findElement);
            }else{
                //大于中间值，在中间值右边进行查找
                return searchElement(arr,start,middle+1,findElement);
            }
        }else{
            //没找到,查找失败，返回-1
            return -1;
        }

    }
}
